package xianchenglock;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;


/**
 * @功能
 * @创建时间 2019/12/18
 */
public class Atom {
 //   volatile int count = 0; //只保证可见性
    AtomicInteger count = new AtomicInteger(0); //原子型,效率更高
  /*synchronized*/   void m(){  // 还能保证原子性
        for(int i=0;i<10000;i++)
     //       count++;
            // count.get（）<1000 // 两个原子型之间会触发原子问题，如线程1到达999，线程二未达1000，中间就会出现第二个线程插进来的问题，第二个线程把内存中的数据变为1000，但第一个线程是那999判断的，于是拿了1000进行计算到达了1001
            count.incrementAndGet(); //替代count++，具有原子性
    }

    public static void main(String[] args) {
        Atom t = new Atom();
        List<Thread> threads = new ArrayList<>();
        for(int i = 0;i<10;i++){
            threads.add(new Thread(t::m,"thread"+i));
        }
        threads.forEach((o)->o.start());
        threads.forEach((o)->{
            try{
                o.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println(t.count);
    }
}
